#pragma once
#include <iostream>
#include <string>
#include <cerrno>
#include <stdio.h>
#include <pthread.h>
using namespace std;

//线程的封装
class Thread
{
public:
typedef void(*func_t)(void*);
typedef enum{
    New=0,
    Running,
    Quit
}Status;
Thread(int tid,func_t func,void *args):_tid(0),_func(func),_args(args),_status(New)
{
    char buf[128];
    snprintf(buf,sizeof(buf),"thread-%d",_tid);
    _name=buf;
}
int get_tid() {
    if(_status==Running)
    return _tid;
    else 
    return -1; //代表当前并没有这个线程
    }

string get_name() {return _name;}
int get_status() {return _status;}

static void* runHelper(void*args) //帮助调用func
{
    Thread * td=(Thread*)args; //拿到当前对象，相当于找到this
    // _func(_args);
   (*td)();
    return nullptr; //因为要求回调函数是void*
}
void operator ()() //仿函数
{
    if(_func )  _func(_args);
}

void join()
{
    int n=pthread_join(_tid,nullptr);
    if(n != 0) //等待失败
    cerr<<"join(): "<<errno<<endl;
    _status=Quit; //成功就退出
}

void run()
{
    int n=pthread_create(&_tid,nullptr,runHelper,this); //把this当成参数喂给runHelp
    if(n != 0)
    cerr<<"run(): "<<errno<<endl;
    _status=Running;
}

~Thread()
{}


private:
    pthread_t  _tid;
    string _name;
    func_t _func;
    void * _args;
    Status _status;
};